#include "menu.h"
#include "include.h"
#include "LQ_12864.h"
#include "LQ_GPIO_KEY.h"

// 菜单项定义
typedef struct {
    const char* name;    // 菜单显示名称
    int8_t value;       // 当前值
    int8_t min;         // 最小值
    int8_t max;         // 最大值
    void (*action)(int8_t); // 回调函数
} MenuItem;

// 菜单模式枚举
typedef enum {
    MODE_MAIN,
    MODE_SETTINGS,
    MODE_CALIBRATION,
    MODE_TEST,
    NUM_MODES
} MenuMode;

// 菜单定义
#include "menu.h"
#include "LQ_GPIO_KEY.h"

// 动态菜单存储
static MenuItem* menus[NUM_MODES] = {NULL};
static uint8_t menu_counts[NUM_MODES] = {0};

// 全局状态
static MenuMode current_mode = MODE_MAIN;
static uint8_t selected_item = 0;
static bool in_submenu = false;

// 初始化菜单系统
void Menu_Init(void) {
    GPIO_KEY_Init();
    Display_Init();
    
    // 初始化主菜单
    Menu_AddItem(MODE_MAIN, "运行模式", 0, 2, ModeSelect_Callback);
    Menu_AddItem(MODE_MAIN, "参数设置", 0, 0, NULL);
    Menu_AddItem(MODE_MAIN, "校准模式", 0, 0, NULL);
    Menu_AddItem(MODE_MAIN, "测试功能", 0, 0, NULL);
}

// 添加菜单项
void Menu_AddItem(MenuMode mode, const char* name, int8_t min, int8_t max, MenuAction action) {
    if(mode >= NUM_MODES) return;
    
    // 重新分配内存
    MenuItem* new_menu = realloc(menus[mode], (menu_counts[mode]+1)*sizeof(MenuItem));
    if(new_menu) {
        menus[mode] = new_menu;
        MenuItem* item = &menus[mode][menu_counts[mode]++];
        
        item->name = name;
        item->value = min;
        item->min = min;
        item->max = max;
        item->action = action;
        item->options = NULL;
    }
}

// 显示菜单
void Menu_Display(void) {
    Display_CLS(U16_BLACK);
    
    if(!menus[current_mode]) return;
    
    for(uint8_t i = 0; i < menu_counts[current_mode]; i++) {
        MenuItem* item = &menus[current_mode][i];
        
        // 显示菜单项
        Display_showString(10, i*10, item->name, 
                          (i == selected_item) ? U16_RED : U16_WHITE,
                          U16_BLACK, 12);
        
        // 显示当前值
        if(i == selected_item && in_submenu) {
            char val_str[16];
            if(item->options && item->options[item->value]) {
                sprintf(val_str, "< %s >", item->options[item->value]);
            } else {
                sprintf(val_str, "< %d >", item->value);
            }
            Display_showString(70, i*10, val_str, U16_YELLOW, U16_BLACK, 12);
        }
    }
}

// 处理按键输入
void Menu_HandleInput(uint8_t key) {
    switch(key) {
        case KEY_UP:
            if(!in_submenu && selected_item > 0) 
                selected_item--;
            break;
            
        case KEY_DOWN:
            if(!in_submenu && selected_item < sizeof(main_menu)/sizeof(MenuItem)-1)
                selected_item++;
            break;
            
        case KEY_ENTER:
            if(!in_submenu) {
                in_submenu = true;
            } else {
                in_submenu = false;
                // 执行菜单项动作
                if(main_menu[selected_item].action)
                    main_menu[selected_item].action(main_menu[selected_item].value);
            }
            break;
            
        case KEY_LEFT:
            if(in_submenu && main_menu[selected_item].value > main_menu[selected_item].min)
                main_menu[selected_item].value--;
            break;
            
        case KEY_RIGHT:
            if(in_submenu && main_menu[selected_item].value < main_menu[selected_item].max)
                main_menu[selected_item].value++;
            break;
    }
    
    Menu_Display();
}

uint8_t GetMenuInput(void) {
    if(!KEY_Read(KEY0)) return MENU_KEY_UP;
    if(!KEY_Read(KEY1)) return MENU_KEY_DOWN;
    if(!KEY_Read(KEY2)) return MENU_KEY_ENTER;
    return MENU_KEY_NONE;
}

void Test_Menu(void) {
    Menu_Init();
    while(1) {
        MenuKey key = GetMenuInput();
        if(key != MENU_KEY_NONE) {
            Menu_HandleInput(key);
            Delay_Ms(100); // 简单消抖
        }
        Menu_Display();
        Delay_Ms(50);
    }
}

// 主菜单回调函数示例
void ModeSelect_Callback(int8_t mode) {
    switch(mode) {
        case 0:
            // 进入自动模式
            break;
        case 1:
            // 进入手动模式
            break;
        case 2:
            // 进入调试模式
            break;
    }
}

// 设置菜单选项文本
void Menu_SetOptions(MenuMode mode, uint8_t index, const char** options) {
    if(mode < NUM_MODES && index < menu_counts[mode]) {
        menus[mode][index].options = options;
    }